草庐IT

MySQL InnoDB 锁的二三事

全部标签

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以来,多线程都存在2个问题:线程之间内存共享,需要通过加锁进行控制,但是加锁会导致性能下降,同时复杂的加锁机制也会增加编程编码难度过多线程造成线程之间的上下文切换,导致效率低下因此,在并发编程领域中,一直有一个很重要的设计原则:“不要通过内存共享来实现通信,而应该通过通信来实现内存共享。”简单来说,就是尽可能通过消息通信,而不是内存共享来实现进程

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美;悟心悟性,善始善终,惟善惟道!——朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以来,多线程都存在2个问题:线程之间内存共享,需要通过加锁进行控制,但是加锁会导致性能下降,同时复杂的加锁机制也会增加编程编码难度过多线程造成线程之间的上下文切换,导致效率低下因此,在并发编程领域中,一直有一个很重要的设计原则:“不要通过内存共享来实现通信,而应该通过通信来实现内存共享。”简单来说,就是尽可能通过消息通信,而不是内存共享来实现进程

[自制操作系统] 第16回 锁的实现

目录一、前景回顾二、锁的实现三、使用锁实现console函数四、运行测试 一、前景回顾  上回我们实现了多线程,并且最后做了一个小小的实验,不过有一点小瑕疵。     可以看到黄色部分的字符不连续,按道理应该是“argBMain”,这是为什么呢?其实仔细思考一下还是很好得出结论。我们的字符打印函数是put_str,实际上是调用的put_char函数。所以打印一个字符串需要多次调用put_char函数来打印一个个字符,如果我们当前线程刚好打印完了arg,正准备打印下一个字符B时,这时发生了调度,那么就造成了上面的这种情况。  由此引申出来了公共资源、临界区和互斥的概念:  公共资源:可以是公共内

[自制操作系统] 第16回 锁的实现

目录一、前景回顾二、锁的实现三、使用锁实现console函数四、运行测试 一、前景回顾  上回我们实现了多线程,并且最后做了一个小小的实验,不过有一点小瑕疵。     可以看到黄色部分的字符不连续,按道理应该是“argBMain”,这是为什么呢?其实仔细思考一下还是很好得出结论。我们的字符打印函数是put_str,实际上是调用的put_char函数。所以打印一个字符串需要多次调用put_char函数来打印一个个字符,如果我们当前线程刚好打印完了arg,正准备打印下一个字符B时,这时发生了调度,那么就造成了上面的这种情况。  由此引申出来了公共资源、临界区和互斥的概念:  公共资源:可以是公共内

聊一聊分布式锁的设计模型

  一、什么是分布式锁?什么是分布式锁?对于这个问题,相信很多同学是既熟悉又陌生。随着分布式系统的快速发展与广泛应用,针对共享资源的互斥访问也成为了很多业务必须要面对的需求,这个场景下人们通常会引入分布式锁来解决问题。我们通常会使用怎么样的分布锁服务呢?有开源的MySQL,Redis,ZooKeeper,Etcd等三方组件可供选择,当然也有集团内自研的Tair,Nuwa等分布式锁服务提供方。总的来看,我们对分布式锁的需求可以大体划分为以下两类应用场景:实现操作原子性:在单机环境中,为了实现多进程或多线程对共享资源操作过程的原子性,我们可以借助内核提供的SpinLock或Mutex机制,保证只有

聊一聊分布式锁的设计模型

  一、什么是分布式锁?什么是分布式锁?对于这个问题,相信很多同学是既熟悉又陌生。随着分布式系统的快速发展与广泛应用,针对共享资源的互斥访问也成为了很多业务必须要面对的需求,这个场景下人们通常会引入分布式锁来解决问题。我们通常会使用怎么样的分布锁服务呢?有开源的MySQL,Redis,ZooKeeper,Etcd等三方组件可供选择,当然也有集团内自研的Tair,Nuwa等分布式锁服务提供方。总的来看,我们对分布式锁的需求可以大体划分为以下两类应用场景:实现操作原子性:在单机环境中,为了实现多进程或多线程对共享资源操作过程的原子性,我们可以借助内核提供的SpinLock或Mutex机制,保证只有

开源二三事|ShardingSphere 与 Database Mesh 之间不得不说的那些事

背景前段时间,以ApacheShardingSphere核心团队组建的创业公司SphereEx,正式对外推出了DatabaseMesh2.0概念以及与之相配套的开源产品Pisanix,这引发了社区间对于ShardingSphere和DatabaseMesh的不少争论与思考。许多用户都很清楚,SphereEx是由ApacheShardingSphere核心团队创立的。那么有部分用户就提出了疑问,既然已经有了ApacheShardingSphere这样一个如此成功的开源项目,为何还要大费周章选择在一个全新的领域从头开始?在云原生趋势的影响下,未来ShardingSphere会不会逐渐被并入到Dat

开源二三事|ShardingSphere 与 Database Mesh 之间不得不说的那些事

背景前段时间,以ApacheShardingSphere核心团队组建的创业公司SphereEx,正式对外推出了DatabaseMesh2.0概念以及与之相配套的开源产品Pisanix,这引发了社区间对于ShardingSphere和DatabaseMesh的不少争论与思考。许多用户都很清楚,SphereEx是由ApacheShardingSphere核心团队创立的。那么有部分用户就提出了疑问,既然已经有了ApacheShardingSphere这样一个如此成功的开源项目,为何还要大费周章选择在一个全新的领域从头开始?在云原生趋势的影响下,未来ShardingSphere会不会逐渐被并入到Dat

Redis分布式锁的五大演进攻略

 本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目PassJava。 本篇主要内容如下:  一、本地锁的问题 首先我们来回顾下本地锁的问题: 目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了10W个请求,每个微服务接收2.5W个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied 或 lock)来锁住自己的线程资源,从而防止缓存击穿。 这是一种本地加锁的方式,在分布式情况下会带来数据不一致的问题:比如服务A获取数据后,更新缓存key=100,服务B不受服务A的锁限制,并发去更新缓存ke

Redis分布式锁的五大演进攻略

 本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目PassJava。 本篇主要内容如下:  一、本地锁的问题 首先我们来回顾下本地锁的问题: 目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了10W个请求,每个微服务接收2.5W个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied 或 lock)来锁住自己的线程资源,从而防止缓存击穿。 这是一种本地加锁的方式,在分布式情况下会带来数据不一致的问题:比如服务A获取数据后,更新缓存key=100,服务B不受服务A的锁限制,并发去更新缓存ke